package Window;
/*
 * A jelgenerátor értékeit beállító ablakot megvalósító osztály
 */
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.StringTokenizer;

import javax.swing.*;

public class SignalModifyWindow extends JFrame {

	private JFrame frame;
	
	//Az adott jelgenerátor értékeit megjelenítendő panel
	protected GraphicalValueDisplayer signalGraphicalPanel;
	 //A View példányát tartalmazó osztály.
	protected View view;
	//Az új ciklikusan egymást követő értékek bevitelére szolgáló mező.
	protected JTextField newSignalValueTextField; 
	 //Az adott jelgenerátor sorszámát tartalmazza.
	protected int nbOfSignal;

	//Konstruktor,lekéri az ablak méreteit, majd létrehozza az adott panelt.
	public SignalModifyWindow(View view, int nbOfSignal){
		this.nbOfSignal=nbOfSignal;
		this.view=view;
		frame = new JFrame("Modify Signal Values");
		frame.setSize(500,500);
		loadFrame();
		frame.setVisible(true);
	}

	//Ablak feltöltése elemekkel
	private void loadFrame(){
		frame.add(assembleControlPanel(),BorderLayout.NORTH);
		frame.add(assembleDisplayPanel(),BorderLayout.CENTER);
	}
	//Címkepanel létrehozása és a címkék csatolása
	private JPanel assembleControlPanel(){
		JLabel valueLabel =new JLabel("Values:",JLabel.CENTER);
		newSignalValueTextField = new JTextField();
		//A TextFieldben találtahó értéket állítja be a jelgenerátornak
		JButton setButton = new JButton("Set Values!");
		ALForSignalModifyWindow aLForSignalModifyWindow = new ALForSignalModifyWindow(nbOfSignal);
		setButton.addActionListener(aLForSignalModifyWindow);
		
		JPanel labelPanel=new JPanel();
		labelPanel.setLayout(new GridLayout(1,3));
		labelPanel.add(valueLabel);
		labelPanel.add(newSignalValueTextField);
		labelPanel.add(setButton);
		
		return labelPanel;
	}
	//A megjelenítők paneljének összerakása
	private JPanel assembleDisplayPanel(){
		signalGraphicalPanel = new GraphicalValueDisplayer(view.getAllValuesOfSignal()[nbOfSignal]);
		JScrollPane stableScroller = new JScrollPane(signalGraphicalPanel); 
		
		JPanel displayPanel=new JPanel();
		displayPanel.setLayout(new GridLayout(1,2));
		displayPanel.add(stableScroller);
		
		return displayPanel;
	}
	//Az értékbeállító gomb ActionListenerje
	private class ALForSignalModifyWindow implements ActionListener{
		int nbOfSignal;		
		public ALForSignalModifyWindow(int nbOfSignal){
			super();
			this.nbOfSignal = nbOfSignal;
		}
		//A kattintáskor meghívódó függvény,amely megszerzi a beviteli mező értékét,majd
		//int tömbbé alakítja és a View-ben lévő tömböt frissíti vele
		public void actionPerformed(ActionEvent e){
			//a nem megfelelő formátum kivételt dobhat
			try{
				int[] formattedValues = ParseNewStateArrayForSignalGenerator(newSignalValueTextField.getText(), true);
				int[][] actualValues = view.getAllValuesOfSignal();
				actualValues[nbOfSignal] = formattedValues.clone();
				//a grafikus megjelenítés adatait frissítjük,majd újrarajzoltatjuk
				signalGraphicalPanel.setValueToDisplay(formattedValues);
				//ha hosszú lesz a grafikon,megnöveljük a rajzoló területet
				if(formattedValues.length>5){
				signalGraphicalPanel.setPreferredSize(new Dimension(formattedValues.length*80+80,300));
				signalGraphicalPanel.revalidate();
				}
				signalGraphicalPanel.repaint();
			}
			catch(Exception exc){
				view.catchException(exc);
			}
		}
		
		//jelgenerátor számára értékeket kiolvasó és formázó függvény
		private int[] ParseNewStateArrayForSignalGenerator(String line, boolean shouldCheckValues) throws Exception{
			int[] retValue;
			//összeszámoljuk a talált értékeket,majd tömböt foglalunk
			StringTokenizer tksForArray =new StringTokenizer(line);
			int countTokens = 0;
			while( tksForArray.hasMoreTokens()){
				tksForArray.nextToken();
				countTokens++;
			}
			
			retValue = new int[countTokens];
			countTokens = 0;
			tksForArray = new StringTokenizer(line);
			//elemenként ellenőrizzük,integer-é alakítjuk és tároljuk a talált számokat
			while( tksForArray.hasMoreTokens()){
				String tempString = tksForArray.nextToken();
				
				int temp = 0;
				try{
					temp = Integer.parseInt( tempString );
				}catch(Exception e){
					throw new Exception("One of the number's format is not acceptable: "+tempString);
				}
				retValue[ countTokens ] = temp;
				
				if( shouldCheckValues && retValue[countTokens] != 0 && retValue[countTokens] != 1)
					throw new Exception("One of the new values are not acceptable: "+retValue[countTokens]);
				countTokens++;
			}
			
			return retValue;
		}
	}
	

}
